package org.leo.dm.util.xml;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.dom4j.DocumentException;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
import org.leo.dm.common.bean.ResultBean;
import org.leo.dm.util.ToUtil;

/**
 * 
 * Created on 2015年11月18日
 * <p>
 * Description Xml格式校验工具
 * <p>
 * Copyright neusoft (c) 2015 .
 * 
 * @author xiao_h
 *
 */
public class XmlValidater {
	/**
	 * 
	 * Created on 2015年11月18日 .
	 * 
	 * @author xiao_h
	 * @param data
	 * @return Result
	 */
	public static ResultBean handle(String data) {
		return handle(new ByteArrayInputStream(data.getBytes()));
	}

	/**
	 * 
	 * Created on 2015年11月18日 .
	 * 
	 * @author xiao_h
	 * @param file
	 * @return Result
	 */
	public static ResultBean handle(File file) {
		try {
			return handle(new FileInputStream(file));
		} catch (FileNotFoundException e) {
			// e.printStackTrace();
			ResultBean result = new ResultBean();
			result.setCode("-1");
			result.setErrorDesc(e.getMessage());
			result.setName("校验文件未找到");
			return result;
		}
	}

	/**
	 * 
	 * Created on 2015年11月18日 .
	 * 
	 * @author xiao_h
	 * @param in
	 * @return Result
	 */
	public static ResultBean handle(InputStream in) {
		ResultBean result = new ResultBean();
		ToUtil tu = new ToUtil();
		try {

			SAXReader sax = new SAXReader();
			sax.setDefaultHandler(new ElementHandler() {
				@Override
				public void onStart(ElementPath elementPath) {
					elementPath.getCurrent().detach();
				}

				@Override
				public void onEnd(ElementPath elementPath) {
					elementPath.getCurrent().detach();
				}
			});
			sax.read(in);
			result.setCode("1");
			result.setName("xml结构正确");
		} catch (DocumentException e) {
			// e.printStackTrace();
			result.setCode("-1");
			result.setErrorDesc(e.getMessage());
			result.setName("xml结构错误");
		} catch (Exception e) {
			// e.printStackTrace();
			result.setCode("-1");
			result.setErrorDesc(e.getMessage());
			result.setName("校验过程发生异常");
		} finally {
			try {
				if (in != null) {
					in.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		tu.showMemory();
		return result;
	}

}
